/**
 * 封装fetch超时功能
 * 这里用一个方法返回featch，可以根据实际需求创建多个不同超时时间的请求
 *
 * @param {*} timeout 超时时间 0代表不设置超时
 * @returns
 */

function createFetchWithTimeout(timeout = 0) {
  return function (url, options = {}) {
    // 信号控制器，用以取消请求
    const singalControl = new AbortController();
    return new Promise((resolve, reject) => {
      // 这里直接将resolve和reject方法丢进then中
      window
        .fetch(url, {
          ...options,
          signal: singalControl.signal,
        })
        .then(resolve, reject);

      if (timeout != 0) {
        // 添加定时器做超时功能，如果定时器到达时候还没有响应，则reject
        setTimeout(() => {
          reject("fetch request timeout!");
          // 超时了，请求取消， 当 abort() 被调用时，这个 fetch() promise 将 reject 一个名为 AbortError 的 DOMException
          singalControl.abort();
        }, timeout);
      }
    });
  };
}
